package com.dtp.common.entity;

import com.dtp.common.em.QueueTypeEnum;
import com.dtp.common.em.RejectedTypeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.util.Set;

/**
 * 动态线程池主要属性类
 *
 * @author yanhom
 * @since 1.0.0
 *
 * @remark muse
 **/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class DtpExecutorProps extends TpExecutorProps {
    private String executorType;        // 执行器类型，用于创建阶段。
    private int queueCapacity = 1024;   // 阻塞队列容量
    private boolean fair = false;       // 如果是公平策略，用于SynchronousQueue
    private int maxFreeMemory = 256;    // MemorySafeLBQ的最大可用内存，单位M
    private String queueType = QueueTypeEnum.VARIABLE_LINKED_BLOCKING_QUEUE.getName();  // 阻塞队列类型，参见：QueueTypeEnum
    private String rejectedHandlerType = RejectedTypeEnum.ABORT_POLICY.getName();       // 拒绝策略执行器类型，参见：RejectedTypeEnum
    private boolean allowCoreThreadTimeOut = false;             // 是否允许核心线程超时
    private String threadNamePrefix = "dtp";                    // 线程名称前缀
    private boolean waitForTasksToCompleteOnShutdown = false;   // 是否在关机时等待定时任务完成，不中断正在运行的任务并执行队列中的所有任务。
    private int awaitTerminationSeconds = 0;        // 为了在容器的其他部分继续关闭之前等待剩余的任务完成执行，该执行器在关闭时应该阻塞的最大秒数。
    private boolean preStartAllCoreThreads = false; // 是否提前启动所有核心线程
    private long runTimeout = 0;                    // 任务执行超时，单位(ms)，仅用于统计。
    private long queueTimeout = 0;                  // 任务队列等待超时，单位(ms)，仅用于统计。
    private Set<String> taskWrapperNames;           // 任务包装器名称

    /** 检查核心参数是否是无效的 */
    public boolean coreParamIsInValid() {
        return this.getCorePoolSize() < 0
                || this.getKeepAliveTime() < 0
                || this.getMaximumPoolSize() <= 0
                || this.getMaximumPoolSize() < this.getCorePoolSize();
    }
}
